package com.cskaoyan.javase.oop3._2inner._4local._1basic;

/**
 * 具体谈访问特点之前,先明确以下两个原则:
 *      1.外围类仍然把局部内部类当"好兄弟",局部内部类仍然可以无条件访问外围类
 *      但是外围类访问局部内部类就变了,只能在作用域内部直接访问局部内部类(这时仍是无条件访问)
 *      出了作用域,就没办法直接访问了
 *
 *      2.既然外围类离开了作用域都无法直接访问局部内部类
 *      那么定义在局部位置的内部类,其它类就更无法访问了.
 *
 * 局部内部类的访问特点
 * 局部内部类的访问特点，我们仍然主要从以下几个角度研究：
 *      1.(重点)局部内部类内部访问外围类
 *          访问的位置: 局部内部类的成员方法,构造器,构造代码块.
 *          接下来根据局部内部类的定义位置不同,分两种情况:
 *          a.定义在外围类成员方法(有this)中的局部内部类,这时完全可以当一个成员内部类去使用
 *              这种局部内部类的成员方法中,除了有自身对象外,还有外围类对象
 *              这时局部内部类的特点就和成员内部类一样了:
 *              局部内部类对象会持有外围类对象的引用作为自身的成员变量
 *              这时访问外围类,如何访问?
 *              直接访问,如果出现同名,用"外围类类名.this"指向外围类对象来区分
 *
 *          b.定义在外围类静态成员方法(没有this,没对象)中的局部内部类
 *              这时局部内部类的成员方法中,只有自身对象,没有外围类对象
 *              这时局部内部类的特点就很类似于静态内部类
 *              这时局部内部类对象和外围类对象就相对独立了
 *              这时访问外围类,如何访问?
 *              直接创建外围类对象,然后访问
 *
 *      2.外围类访问局部内部类成员
 *          只可以在作用域内部访问,出了作用域不能直接访问
 *
 *      3.外部类访问局部内部类成员
 *          不可以直接访问了,一定访问不到
 *      4.局部内部类访问外部类成员
 *          可以访问,创建对象即可,但全程受权限限制
 * @since 11:49
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        EnclosedClazz ec = new EnclosedClazz();
        ec.testEnclose();

        EnclosedClazz.testStatic();
    }
}

class EnclosedClazz {
    int a;
    private int b = 100;
    static final int C = 200;
    static int d = 300;

    // 外围类的成员方法
    public void testEnclose() {
        // 外围类的成员方法中的局部内部类
        class Inner {
            int a;
            private int b = 10;
            static final int C = 20;

            // 外围类的成员方法中的局部内部类,中的成员方法,隐含两个对象,自身局部内部类对象,外围类对象
            public void testInner() {
                System.out.println(a);
                System.out.println(b);
                System.out.println(EnclosedClazz.this.a);
                System.out.println(EnclosedClazz.this.b);
            }
        }
        Inner i = new Inner();
        System.out.println(i.a);
        System.out.println(i.b);
    }

    // 外围类的静态方法
    public static void testStatic() {
        // 外围类的静态成员方法中的局部内部类
        class Inner {
            int a;
            private int b = 10;
            static final int C = 20;

            // 外围类的静态成员方法中的局部内部类,中的成员方法,只隐含一个对象,是this,自身局部内部类对象
            public void testInner() {
                System.out.println(a);
                System.out.println(b);
                EnclosedClazz ec = new EnclosedClazz();
                System.out.println(ec.a);
                System.out.println(ec.b);
            }
        }
        Inner i = new Inner();
        System.out.println(i.a);
        System.out.println(i.b);
    }
}